package registnet.base;

import java.util.List;

/**
 * Defines an interface for checklist implementations.
 */
public interface IChecklist {

	/**
	 * Returns the student number of student associated with the checklist.
	 * @return the student number of student associated with the checklist
	 */
	public String getStudentNumber();
	
	/**
	 * Sets the student number of student to be associated with the checklist.
	 * @param studentNumber - the student number to be associated with the checklist
	 */
	public void setStudentNumber(String studentNumber);
	
	/**
	 * Returns the curriculum of the student associated with the checklist.
	 * @return the curriculum of the student associated with the checklist
	 */
	public ICurriculum getCurriculum();
	
	/**
	 * Returns the plan of coursework of the student associated with the checklist.
	 * @return the plan of coursework of the student associated with the checklist
	 */
	public IPlanOfCourseWork getPlanOfCourseWork();
	
	/**
	 * Sets the plan of coursework of the student associated with the checklist.
	 * @param planOfCourseWork - the plan of coursework of the student associated with the checklist
	 */
	public void setPlanOfCourseWork(IPlanOfCourseWork planOfCourseWork);
	
	/**
	 * Returns the transcript of the student associated with the checklist.
	 * @return the transcript of the student associated with the checklist
	 */
	public ITranscript getTranscript();
	
	/**
	 * Sets the transcript of the student associated with the checklist.
	 * @param transcript - the transcript of the the student associated with the checklist
	 */
	public void setTranscript(ITranscript transcript);
	
	/**
	 * Adds course to the list of courses associated with the checklist. 
	 * The course can either be <code>CourseTaken</code> or <code>CourseWork</code> or <code>Course</code>.
	 * <p>
	 * <code>CourseTaken</code> are courses that are taken by the student and thus have a grade.<br>
	 * <code>CourseWork</code> are courses that are indicated in the student's plan of coursework.<br>
	 * <code>Course</code> are courses that are indicated in the curriculum of the student.
	 * @param course - the course to be added to the list of courses associated with the checklist
	 */
	public void addCourse(ICourse course);
	
	/**
	 * Returns the list of courses associated with the checklist.
	 * @return the list of courses associated with the checklist
	 */
	public List<ICourse> getAllCourses();
	
	/**
	 * Returns the list of courses associated with the checklist for the given year and semester.
	 * @param year
	 * @param semester
	 * @return the list of courses associated with the checklist for the given year and semester
	 */
	public List<ICourse> getCourses(int year, int semester);
	
	/**
	 * Returns the list of courses associated with the checklist for the given year.
	 * @param year
	 * @return the list of courses associated with the checklist for the given year
	 */
	public List<ICourse> getCourses(int year);
	
	/**
	 * Returns the list of courses associated with the checklist with the given course code.
	 * @param courseCode
	 * @return the list of courses associated with the checklist with the given course code
	 */
	public List<ICourse> getCourses(String courseCode);
	
	/**
	 * Checks if a course with the given course code is associated with the checklist.
	 * @param courseCode
	 * @return <code>true</code> if the course is associated with the checklist 
	 * and <code>false</code> otherwise.
	 */
	public boolean contains(String courseCode);
	
	/**
	 * Checks if a course is associated with the checklist.
	 * @param course
	 * @return <code>true</code> if the course is associated with the checklist 
	 * and <code>false</code> otherwise.
	 */
	public boolean contains(ICourse course);
	
	/**
	 * Checks if a course is satisfied/passed. 
	 * @param course
	 * @return <code>true</code> if the course is satisfied/passed 
	 * and <code>false</code> otherwise.
	 */
	public boolean isSatisfied(ICourse course);
	
	/**
	 * Checks if a course is a recommended course.
	 * @param courseCode - the course code of the course
	 * @return <code>true</code> if the the course is a recommended course 
	 * and <code>false</code> otherwise.
	 */
	public boolean isRecommended(String courseCode);
	
	/**
	 * Returns the list of all the courses associated with the checklist
	 * that are already taken by the student.
	 * @return the list of all the courses associated with the checklist
	 * that are already taken by the student
	 */
	public List<ICourse> getAllCoursesTaken();
	
	/**
	 * Returns the list of all the courses associated with the checklist
	 * that are not yet taken by the student.
	 * @return the list of all the courses associated with the checklist
	 * that are not yet taken by the student
	 */
	public List<ICourse> getAllCoursesToTake();
	
	/**
	 * Returns the list of all the courses associated with the checklist
	 * that are taken by the student and has a grade of INC.
	 * @return the list of all the courses associated with the checklist
	 * that are taken by the student and has a grade of INC.
	 */
	public List<ICourse> getAllCoursesToComplete();
	
	/**
	 * Returns the list of all the courses associated with the checklist
	 * that are taken by the student and has a grade of 4.
	 * @return the list of all the courses associated with the checklist
	 * that are taken by the student and has a grade of 4
	 */
	public List<ICourse> getAllCoursesToRemove();
	
	/**
	 * Determines the recommended courses to be taken by the student for the next semester.
	 */
	public void determineRecommendedCourses();
	
	/**
	 * Returns the list of recommended courses to be taken by the student for the next semester.
	 * @return the list of recommended courses to be taken by the student for the next semester
	 */
	public List<ICourse> getRecommendedCourses();
	
	/**
	 * Determines the extra courses taken by the student. Extra courses are courses taken by the 
	 * student which are not specified in the student's curriculum or plan of study.
	 */
	public void determineExtraCourses();
	
	/**
	 * Returns the list of extra courses taken by the student. Extra courses are courses taken by the 
	 * student which are not specified in the student's curriculum or plan of study.
	 * @return the list of extra courses taken by the student
	 */
	public List<ICourse> getExtraCourses();
	
	/**
	 * Returns the classification of the student for the current semester. 
	 * @return the classification of the student for the current semester
	 */
	public Classification getClassification();
	
}
